package com.hsurosy.types.design.framework.tree;

import lombok.Getter;
import lombok.Setter;

/**
 * @Author Hsu琛君珩
 * @Date 2025-08-11 3:44
 * @Description 抽象策略路由器
 * @Version: v1.0.0
 */
public abstract class AbstractStrategyRouter<T, D, R> implements StrategyMapper<T, D, R>, StrategyHandler<T, D, R> {

    // 默认策略处理器
    @Getter
    @Setter
    protected StrategyHandler<T, D, R> defaultStrategyHandler = StrategyHandler.DEFAULT;

    /**
     * 路由方法，根据请求参数和动态上下文选择合适的策略处理器并执行
     * @param requestParameter 请求参数
     * @param dynamicContext 动态上下文
     * @return 策略执行后的结果
     * @throws Exception 如果获取策略处理器或执行时出错
     */
    public R router(T requestParameter, D dynamicContext) throws Exception {
        // 1. 获取策略处理器
        StrategyHandler<T, D, R> strategyHandler = get(requestParameter, dynamicContext);
        // 2. 如果找到了合适的策略处理器，应用策略
        if (null != strategyHandler) return strategyHandler.apply(requestParameter, dynamicContext);
        // 3. 如果没有找到合适的策略，使用默认策略处理器
        return strategyHandler.apply(requestParameter, dynamicContext);
    }


}
